home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / tools / xb / fncsrc / lzhfnc.has < prev    next >
Encoding:
Text File  |  1995-06-05  |  13.3 KB  |  1,009 lines

  1.  
  2.     .include    doscall.mac
  3.     .include    fefunc.h
  4.     .include    fdef.h
  5.  
  6.  
  7. BUF_SIZE    .equ    $1000
  8.  
  9.  
  10.     .offset        0
  11. bit_work:    .ds.l    1    * 必要
  12.  
  13. FP:        .ds.w    1
  14. STP:        .ds.l    1
  15. _dis:        .ds.l    1
  16. _filesize:    .ds.l    1
  17.  
  18. EXT_BUF:    .ds.l    1
  19. left_area:    .ds.l    1    * 配列サイズ
  20.  
  21.  
  22. _header:        .ds.b    1
  23. lzhID:            .ds.b    5    * '-lh?-'
  24. src_filesize:        .ds.l    1
  25. ext_filesize:        .ds.l    1
  26. datetime:        .ds.l    1    * 日付&時間
  27. attribute:        .ds.b    2    * $20,$01
  28. ext_filename_size:    .ds.b    1
  29. ext_filename:        .ds.b    128
  30.             .even
  31.  
  32.  
  33. FileBuf:
  34. _direct:        .ds.b    256    * 兼用
  35. _filename:        .ds.b    256    * ワーク
  36.  
  37.     ***    table    ***
  38. M0ca2:        .ds.b    2038
  39. M1498:        .ds.b    2038
  40.  
  41.  
  42. M1c8e:        .ds.w    $1000
  43. M3c8e:        .ds.w    $100
  44.  
  45. M3e8e:        .ds.b    510    * 数値を表わすのに何ビット必要か (ハフマン)
  46. M408c:        .ds.b    128        *.ds.b    128+4
  47.  
  48. M4192:        .ds.w    1
  49. M4194:        .ds.w    17    *
  50. M41b6:        .ds.w    17    *
  51. M41d8:        .ds.w    17    *
  52.  
  53.  
  54. buf2:        .ds.b    BUF_SIZE
  55.  
  56.         .ds.b    $10        * きもち
  57.         .even
  58. WORK_SIZE:
  59.  
  60.  
  61.  
  62.  
  63.  
  64.  
  65.     .text
  66.     .even
  67.  
  68.     .dc.l    ret
  69.     .dc.l    ret
  70.     .dc.l    ret
  71.     .dc.l    ret
  72.     .dc.l    ret
  73.     .dc.l    ret
  74.     .dc.l    ret
  75.     .dc.l    ret
  76.     .dc.l    ptr_token
  77.     .dc.l    ptr_param
  78.     .dc.l    ptr_exec
  79.     .dc.l    0,0,0,0,0
  80.  
  81. ret:
  82.     rts
  83. ptr_token:
  84.     .dc.b    'lzh_extend',0
  85.     .dc.b    0
  86.     .even
  87. ptr_param:
  88.     .dc.l    p_lzh_extend
  89. ptr_exec:
  90.     .dc.l    e_lzh_extend
  91.  
  92.  
  93. p_lzh_extend:
  94.     .dc.w    str_val
  95.     .dc.w    $0077        * int,char,float 型 1,2 次元配列  ras(n,d)
  96.     .dc.w    int_ret
  97.  
  98.  
  99. e_lzh_extend:
  100.     lea.l    WORK_adr,a6
  101.  
  102.     movea.l    par1+6(sp),a0    * file name
  103.     clr.w    -(sp)
  104.     move.l    a0,-(sp)
  105.     DOS    _OPEN
  106.     addq.l    #6,sp
  107.     move.w    d0,FP(a6)
  108.     bmi    file_cant_open
  109.  
  110.     movea.l    par2+6(sp),a1        * 展開先の配列
  111.     move.w    4(a1),d3    * 次元 -1
  112.     move.w    d3,d0
  113.     add.w    d0,d0
  114.     add.w    d3,d0
  115.     add.w    d0,d0    * 6n-6
  116.     lea.l    4+6(a1,d0.w),a0
  117.     move.l    a0,EXT_BUF(a6)        * 展開先のアドレス
  118.  
  119.     moveq    #0,d0
  120.     lea.l    6(a1),a0    * 各項のサイズ+添字大きさ先頭
  121.     move.w    (a0)+,d0
  122. @@:
  123.         moveq    #0,d1
  124.         move.w    (a0)+,d1
  125.         addq.l    #1,d1
  126.         FPACK    __UMUL
  127.     dbra    d3,@b
  128.     move.l    d0,left_area(a6)    * 展開先の大きさ
  129.  
  130.  
  131.     lea.l    _header(a6),a3
  132.  
  133.     move.w    FP(a6),-(sp)
  134.     DOS    _FGETC
  135.     addq.l    #2,sp
  136.     move.l    d0,d4        * header size
  137.     beq    not_lzh_file
  138.     addq.w    #1,d4
  139.  
  140.     move.l    d4,-(sp)    * header get
  141.     move.l    a3,-(sp)
  142.     move.w    FP(a6),-(sp)
  143.     DOS    _READ
  144.     lea.l    10(sp),sp
  145.  
  146.  
  147.     lea.l    src_filesize(a6),a0
  148.     moveq    #3-1,d1        * src file size  &  ext file size  &  file time date
  149.                 * 並び換え(Intel format -> Motorola format)
  150. @@:
  151.     move.l    (a0),d0
  152.     ror.w    #8,d0
  153.     swap    d0
  154.     ror.w    #8,d0
  155.     move.l    d0,(a0)+
  156.     dbra    d1,@b
  157.  
  158.  
  159.     lea.l    ext_filename_size(a6),a1    * ( AK0.03 )
  160.     moveq    #0,d2
  161.     move.b    (a1),d2
  162.     lea.l    5(a1,d2.w),a0
  163.     move.b    (a0),d1
  164.     lsl.w    #8,d1
  165.     move.b    -(a0),d1        * ディレクトリ情報SIZE ?
  166.  
  167.  
  168.     *lea.l    lzhID,a3
  169.     addq.l    #1,a3
  170.     cmpi.b    #'-',(a3)+
  171.     bne    format_err
  172.     cmpi.w    #'lh',(a3)+
  173.     bne    format_err
  174.     move.b    (a3)+,d6
  175.     cmpi.b    #'-',(a3)
  176.     bne    format_err
  177.     cmpi.b    #'d',d6        * ディレクトリ? CHECK
  178.     beq    format_err
  179.     subi.b    #'0',d6        * 対応フォーマット 'lhX' : X = 0 or 4 or 5
  180.     move.b    d6,d0
  181.     beq    Lha124
  182.     subq.b    #4,d0
  183.     beq    Lha124
  184.     subq.b    #1,d0
  185.     bne    format_err
  186. Lha124:
  187.  
  188.  
  189.     btst    #4,attribute(a6)    * アトリビュート
  190.     bne    format_err
  191.  
  192.     cmpi.b    #'H',3(a1,d2.w)        * 使用OSのチェック ( AK0.03 )
  193.     beq    Human            *   H=Human , M=MSDOS , U=Unix , ...
  194.  
  195.  
  196.     * Human以外のOSに対する処理 ( AK0.03 )
  197.     * つまりフォーマットのわかってない所は全部読み飛ばす
  198.     * 従って、ディレクトリ情報などがもしあったとしても
  199.     * 展開されることはない
  200.     lea.l    5(a1,d2.w),a0
  201.     moveq    #0,d0
  202.     move.b    (a0),d0
  203.     lsl.w    #8,d0
  204.     move.b    -(a0),d0
  205.  
  206.     bsr    読飛0
  207.     clr.w    d1
  208.  
  209.  
  210. Human:
  211.     bsr    dir_get        * ( AK0.03 )( AK0.04 )
  212.  
  213.     movea.l    EXT_BUF(a6),a3
  214.     move.l    ext_filesize(a6),d5
  215.  
  216.     cmp.l    left_area(a6),d5
  217.     bhi    mem_over
  218.  
  219.     tst.b    d6
  220.     bne    ext01
  221. mama:                    * 無圧縮
  222.     move.l    d5,-(sp)
  223.     move.l    a3,-(sp)
  224.     move.w    FP(a6),-(sp)
  225.     DOS    _READ
  226.     lea.l    10(sp),sp
  227.     bra    close
  228.  
  229.  
  230.  
  231. ext01:
  232.     move.l    src_filesize(a6),d2
  233.     subq.l    #2,d2
  234.     bmi    format_err
  235.  
  236.     moveq    #2,d7
  237.     bsr    extension        *
  238.  
  239.  
  240. close:
  241.     move.w    FP(a6),-(sp)
  242.     DOS    _CLOSE
  243.     addq.l    #2,sp
  244.     move.l    ext_filesize(a6),d0
  245. return_d0:
  246.     lea.l    fac(pc),a0
  247.     move.l    d0,6(a0)
  248.     moveq.l    #0,d0
  249.     rts
  250. fac:
  251.     .dc.w    0
  252.     .dc.l    0
  253.     .dc.l    0
  254.  
  255.  
  256. **    **    **    **    **    **
  257.  
  258. file_cant_open:
  259.     lea.l    _file_cant_open(pc),a1
  260.     moveq    #1,d0
  261.     rts
  262. not_lzh_file:
  263. format_err:
  264.     lea.l    _not_lzh_file(pc),a1
  265.     moveq    #1,d0
  266.     rts
  267. mem_over:
  268.     lea.l    _mem_over(pc),a1
  269.     moveq    #1,d0
  270.     rts
  271. _mem_over:
  272.     .dc.b    '配列が展開ファイルの大きさより小さいです',0
  273. _not_lzh_file:
  274.     .dc.b    '指定のファイルは .LZH 形式の圧縮ファイルではなさそうです',0
  275. _file_cant_open:
  276.     .dc.b    '指定のファイルをオープンできません',0
  277.     .even
  278.  
  279.  
  280.  
  281. **    **    **    **    **    **
  282.  
  283. **    **    **    **    **    **
  284.  
  285.  
  286.         * ヘッダのいらない尻尾を読み飛ばす ( AK0.03 )
  287. 読飛:
  288.     subq.l    #8,sp
  289.     move.w    FP(a6),(sp)
  290.     bra    読飛_mucha
  291.  
  292. 読飛0:
  293.     sub.l    d0,src_filesize(a6)
  294.     subq.w    #2,d0
  295.     bls    読飛終了
  296.     move.w    #1,-(sp)
  297.     move.l    d0,-(sp)
  298.     move.w    FP(a6),-(sp)
  299.     DOS    _SEEK
  300. 読飛_mucha:
  301.     DOS    _FGETC
  302.     move.b    d0,d1
  303.     DOS    _FGETC
  304.     lsl.w    #8,d0
  305.     move.b    d1,d0
  306.     addq.l    #8,sp
  307.     bra    読飛0
  308.  
  309. 読飛終了:
  310.     rts
  311.  
  312.  
  313. **    **    **    **    **    **
  314.  
  315. **    **    **    **    **    **
  316.  
  317. **    **    **    **    **    **
  318.  
  319.  *        ディレクトリ情報 読み込み ( AK0.03 )( AK0.04 )
  320. dir_get:
  321.     sub.l    d1,src_filesize(a6)
  322.     subq.w    #2,d1
  323.     bcs    dir_get_1
  324.  
  325.     move.l    d1,-(sp)
  326.     pea.l    _direct(a6)
  327.     move.w    FP(a6),-(sp)
  328.     DOS    _READ
  329.     lea.l    10(sp),sp
  330.  
  331.     lea.l    _direct+1(a6),a2
  332.     subq.w    #2,d1
  333.  
  334.     bsr    読飛
  335. dir_get_1:
  336.     rts
  337.  
  338.  
  339. **    **    **    **    **    **
  340.  
  341. **    **    **    **    **    **
  342.  
  343.  
  344.  
  345.  
  346.  
  347. *    a3 :    展開先
  348. *    d5 :    展開後のファイルサイズ
  349.  
  350.  
  351. *    .xdef    extension
  352. extension:
  353.     movem.l    d3-d6/a3-a5,-(sp)
  354.     moveq    #2,d7
  355.     swap    d7
  356.     moveq    #$10,d1
  357.     bsr    bitworknew
  358.  
  359.     lea.l    M1c8e(a6),a4
  360.     lea.l    M3e8e(a6),a5
  361.     subq.l    #1,d5
  362.     bcs    ext_end
  363.  
  364.     bsr    table_new
  365.  
  366.  
  367. ext_loop:
  368.     moveq    #0,d0
  369.     move.w    (a6),d0
  370.     move.w    d0,d3
  371.     lsl.w    #4,d3    * 下4ビット (d3 は bite のみ有効)
  372.     lsr.w    #4,d0    * 上12ビット
  373.     add.w    d0,d0
  374.     move.w    (a4,d0.w),d0
  375.     cmp.w    #$1fe,d0
  376.     bcs    @f
  377.     move.w    #$1fe,d1
  378.     bsr    number_get
  379. @@:
  380.  
  381.     move.b    (a5,d0.w),d1
  382.     bsr    bitworknew        *
  383.  
  384.     cmpi.w    #$ff,d0
  385.     bhi    slide_dic
  386.     move.b    d0,(a3)+
  387.     dbra    d5,ext_loop_cont
  388.     clr.w    d5
  389.     subq.l    #1,d5
  390.     bcc    ext_loop_cont
  391.     bra    ext_end
  392.  
  393.  
  394. slide_dic:
  395.     move.l    d0,d2
  396.     move.w    (a6),d3
  397.     clr.w    d0
  398.     move.b    (a6),d0
  399.     add.w    d0,d0
  400.     lea.l    M3c8e(a6),a0
  401.     move.w    (a0,d0.w),d0
  402.     moveq    #$e,d1
  403.     cmp.w    d1,d0
  404.     bcs    @f
  405.     bsr    number_get
  406. @@:
  407.  
  408.     lea.l    -1(a3),a0
  409.     lea.l    M408c(a6),a1
  410.     move.b    (a1,d0.w),d1
  411.     bsr    bitworknew
  412.     move.w    d0,d1
  413.     beq    sdc01
  414.  
  415.     subq.w    #1,d1
  416.     move.l    d4,d0
  417.     clr.w    d0
  418.     rol.l    d1,d0
  419.     bset    d1,d0
  420.     bsr    bitworknew
  421.  
  422.     suba.w    d0,a0
  423. sdc01:
  424.     sub.w    #$fd,d2
  425.     sub.l    d2,d5
  426.     bcs    L298
  427.  
  428.     subq.w    #1,d2
  429. @@:
  430.     move.b    (a0)+,(a3)+
  431.     dbra    d2,@b
  432.  
  433. ext_loop_cont:
  434.     dbra    d6,ext_loop
  435.     bsr    table_new
  436.     bra    ext_loop
  437.  
  438.  
  439. L298:
  440.     subq.w    #1,d2
  441. @@:
  442.     move.b    (a0)+,(a3)+
  443.     dbra    d2,@b
  444.  
  445. ext_end:
  446.     movem.l    (sp)+,d3-d6/a3-a5
  447.     rts
  448.  
  449.  
  450.  
  451.  
  452.  
  453.  
  454.  
  455.  
  456. *    .xdef    number_get
  457. number_get:        * input d0.w d1.w d3.b
  458.     lea.l    M1498(a6),a0
  459.     lea.l    M0ca2(a6),a1
  460. ng1:
  461.     add.w    d0,d0
  462.     add.b    d3,d3
  463.     bcc    ng2
  464.     move.w    (a0,d0.w),d0
  465.     cmp.w    d1,d0
  466.     bcc    ng1
  467.     rts
  468. ng2:
  469.     move.w    (a1,d0.w),d0
  470.     cmp.w    d1,d0
  471.     bcc    ng1
  472.     rts
  473.  
  474.  
  475.  
  476.  
  477.  
  478. *    .xdef    table_new
  479. table_new:
  480.     moveq    #$10,d1
  481.     move.w    (a6),d0
  482.     bsr    bitworknew
  483.     subq.w    #1,d0
  484.     move.w    d0,d6
  485.  
  486.     move.l    #$5_0003,-(sp)
  487.     move.w    #$13,-(sp)
  488.     bsr    L51a        *
  489.     bsr    L3f0        *
  490.     move.l    #$4_ffff,(sp)
  491.     move.w    #$e,-(sp)
  492.     bsr    L51a        *
  493.     addq.l    #8,sp
  494.     rts
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502. **    **    **    **    **    **    **
  503.  
  504.  
  505. *    .xdef    L3f0
  506. L3f0:
  507.     movem.l    a3/a5,-(sp)
  508.     lea.l    M3e8e(a6),a3
  509.     moveq    #9,d1
  510.     move.w    (a6),d0
  511.     lsr.w    #$10-9,d0
  512.     bsr    bitworknew
  513.  
  514.     cmpi.w    #$1fe,d0
  515.     bhi    format_err
  516.     tst.w    d0
  517.     bne    L44c
  518.  
  519.     *
  520.     move.w    #$1fe/2-1,d1
  521. L41e:
  522.     move.w    d0,(a3)+
  523.     dbra    d1,L41e
  524.  
  525.     moveq    #9,d1
  526.     move.w    (a6),d0
  527.     lsr.w    #$10-9,d0
  528.     bsr    bitworknew
  529.  
  530.     move.w    d0,d1
  531.     swap    d0
  532.     move.w    d1,d0
  533.     move.w    #$1000/8-1,d1
  534.     lea.l    M1c8e(a6),a0
  535. @@:
  536.     move.l    d0,(a0)+
  537.     move.l    d0,(a0)+
  538.     move.l    d0,(a0)+
  539.     move.l    d0,(a0)+
  540.     dbra    d1,@b
  541.     bra    L514
  542.  
  543.  
  544. L44c:        * d0 nonzero
  545.     movea.l    a3,a5
  546.     adda.w    d0,a5
  547.  
  548.  
  549. tm1_loop:
  550.     move.w    (a6),d0
  551.     move.w    d0,d3
  552.     lsr.w    #8,d0
  553.     add.w    d0,d0
  554.     lea.l    M3c8e(a6),a0
  555.     move.w    (a0,d0.w),d0
  556.     moveq.l    #$13,d1
  557.     cmp.w    d1,d0
  558.     bcs    @f
  559.     bsr    number_get
  560. @@:
  561.  
  562.     lea.l    M408c(a6),a0
  563.     move.b    (a0,d0.w),d1
  564.     bsr    bitworknew
  565.     move.w    d0,d3
  566.     subq.w    #2,d3
  567.     bhi    L4d6
  568.     bne    L4aa
  569.     moveq.l    #9,d1
  570.     move.w    (a6),d0
  571.     lsr.w    #$10-9,d0
  572.     bsr    bitworknew
  573.  
  574.     moveq.l    #$13,d3
  575.     add.w    d0,d3
  576.     bra    L4cc
  577.  
  578. L4aa:
  579.     addq.w    #1,d3
  580.     bne    L4c2
  581.     moveq.l    #4,d1
  582.     moveq    #0,d0
  583.     move.b    (a6),d0
  584.     lsr.w    d1,d0        * 実は $10-4-8 = 4 = d1
  585.     bsr    bitworknew
  586.     addq.w    #2,d0
  587.     move.w    d0,d3
  588. L4cc:
  589.     clr.b    (a3)+
  590.     dbra    d3,L4cc
  591.     bra    L450
  592.  
  593. L4c2:
  594.     clr.b    (a3)+
  595.     bra    L450
  596.  
  597.  
  598. L4d6:
  599.     move.b    d3,(a3)+
  600.     *bra    L450
  601.  
  602.  
  603.     *
  604. L450:
  605.     cmpa.l    a5,a3
  606.     bcs    tm1_loop
  607.     moveq.l    #0,d0
  608.     move.l    a3,d1
  609.     lea.l    M408c(a6),a3
  610.     exg.l    d1,a3
  611.     sub.l    a3,d1
  612.     ble    L4f2
  613.     subq.w    #1,d1
  614. @@:
  615.     move.b    d0,(a3)+
  616.     dbra    d1,@b
  617. L4f2:
  618.     pea.l    M1c8e(a6)
  619.     pea.l    $c.w
  620.     pea.l    M3e8e(a6)
  621.     move.w    #$1fe,-(sp)
  622.     bsr    table_make
  623.     lea.l    $e(sp),sp
  624. L514:
  625.     movem.l    (sp)+,a3/a5
  626.     rts
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633. *    .xdef    L51a
  634. L51a:
  635.     movem.l    a3-a5,-(sp)
  636.     move.w    $a-4+12(sp),d1
  637. *    moveq.l    #$10,d3
  638. *    sub.w    d1,d3
  639. *    move.w    (a6),d0
  640. *    lsr.w    d3,d0
  641.     move.l    d4,d0
  642.     clr.w    d0
  643.     rol.l    d1,d0
  644.     bsr    bitworknew
  645.  
  646.     cmp.w    8-4+12(sp),d0
  647.     bhi    format_err
  648.     lea.l    M408c(a6),a3
  649.     tst.w    d0
  650.     bne    L574
  651.     move.w    8-4+12(sp),d1
  652.     ble    L54e
  653.     subq.w    #1,d1
  654. @@:
  655.     move.b    d0,(a3)+
  656.     dbra    d1,@b
  657. L54e:
  658.     move.w    $a-4+12(sp),d1
  659. *    moveq.l    #$10,d3
  660. *    sub.w    d1,d3
  661. *    move.w    (a6),d0
  662. *    lsr.w    d3,d0
  663.     move.l    d4,d0
  664.     clr.w    d0
  665.     rol.l    d1,d0
  666.     bsr    bitworknew
  667.  
  668.     lea.l    M3c8e(a6),a0
  669.     moveq    #$100/2-1,d1
  670. L56a:
  671.     move.w    d0,(a0)+
  672.     move.w    d0,(a0)+
  673.     dbra    d1,L56a
  674.     bra    L60e    * sub end
  675.  
  676.  
  677. L574:
  678.     movea.l    a3,a4
  679.     adda.w    d0,a4
  680.     movea.l    a3,a5
  681.     adda.w    $c-4+12(sp),a5
  682. L57e:
  683.     cmpa.l    a4,a3
  684.     bcc    L5d4
  685.     moveq.l    #3,d1
  686.     move.l    d4,d0
  687.     clr.w    d0
  688.     rol.l    d1,d0
  689.     bsr    bitworknew
  690.  
  691.     cmpi.b    #7,d0
  692.     bne    L5b2
  693.     move.w    (a6),d1
  694.     add.w    d1,d1
  695.     bcc    L5a4
  696. L59c:
  697.     addq.w    #1,d0
  698.     add.w    d1,d1
  699.     bcs    L59c
  700.  
  701.  
  702. L5a4:
  703.     move.w    d0,d1
  704.     subq.w    #6,d1
  705.     bsr    bitworknew
  706. L5b2:
  707.     move.b    d0,(a3)+
  708.     cmpa.l    a5,a3
  709.     bne    L57e
  710.     moveq.l    #2,d1
  711.     move.l    d4,d0
  712.     clr.w    d0
  713.     rol.l    d1,d0
  714.     bsr    bitworknew
  715.  
  716.  
  717.     tst.w    d0
  718.     ble    L57e
  719.     moveq.l    #0,d1
  720.     subq.w    #1,d0
  721. L5cc:
  722.     move.b    d1,(a3)+
  723.     dbra    d0,L5cc
  724.     bra    L57e
  725.  
  726.  
  727. L5d4:
  728.     moveq.l    #0,d0
  729.     move.l    a3,d1
  730.     lea.l    M408c(a6),a3
  731.     exg.l    d1,a3
  732.     sub.l    a3,d1
  733.     add.w    8-4+12(sp),d1
  734.     subq.w    #1,d1
  735.     bmi    L5ee
  736.     *swap    d0    * d0.b = 0
  737.     clr.w    d0
  738. L5e8:
  739.     move.b    d0,(a3)+
  740.     dbra    d1,L5e8
  741. L5ee:
  742.     pea.l    M3c8e(a6)
  743.     pea.l    8.w
  744.     pea.l    M408c(a6)
  745.     move.w    8-4+12+12(sp),-(sp)
  746.     bsr    table_make
  747.     lea.l    $e(sp),sp
  748. L60e:
  749.     movem.l    (sp)+,a3-a5
  750.     rts
  751.  
  752.  
  753.  
  754.  
  755.  
  756.  
  757. ****
  758.  
  759. *    d1 ビット分ワークに入力する
  760.  
  761. *    .xdef    bitworknew
  762. bitworknew:
  763.     cmp.b    d7,d1
  764.     ble    L748
  765.     sub.b    d7,d1
  766.     lsl.l    d7,d4
  767.  
  768.     swap    d7
  769.     subq.w    #2,d7
  770.     bne    rd_2
  771.     bsr    read
  772. rd_2:
  773.     swap    d7
  774.  
  775.     move.w    (a2)+,d4
  776.     move.w    #$10,d7        * 16 bit
  777. L748:
  778.     sub.b    d1,d7
  779.     lsl.l    d1,d4
  780.     move.l    d4,(a6)
  781.     rts
  782.  
  783.  
  784.  
  785.  
  786. *    .xdef    read
  787. read:
  788.     move.l    d0,-(sp)
  789.     move.l    #BUF_SIZE,d0
  790.     move.w    d0,d7
  791.     sub.l    d0,src_filesize(a6)
  792.     bcc    read_1
  793.     add.l    src_filesize(a6),d0
  794. read_1:
  795.     lea.l    buf2(a6),a2
  796.     move.l    d0,-(sp)
  797.     move.l    a2,-(sp)
  798.     move.w    FP(a6),-(sp)
  799.     DOS    _READ
  800.     lea.l    10(sp),sp
  801.     move.l    (sp)+,d0
  802.     rts
  803.  
  804.  
  805.  
  806.  
  807.  
  808.  
  809.  
  810.  
  811. ****
  812.  
  813. * example
  814. *    para1.w        $1fe(=510)    8(a6)  $13 or $e
  815. *    para2.l        M3e8e(510)    M408c(128)
  816. *    para3.l        $c(2^c+1=8192)    8(2^8+1=512)
  817. *    para4.l        M1c8e(8192)    M3c8e(512)
  818.  
  819.  
  820. *    .xdef    table_make
  821. table_make:
  822.     movem.l    d3-d7/a2-a5,-(sp)
  823.     move.w    8-4+4*9(sp),d3
  824.     movem.l    $c-2-4+4*9(sp),a3/a4
  825.     lea.l    M4192(a6),a5
  826.  
  827.  
  828.     movea.l    a5,a0
  829.     moveq.l    #0,d0
  830.     moveq    #52/2-1,d5
  831. L7c8:
  832.     move.l    d0,(a0)+
  833.     dbra    d5,L7c8
  834.  
  835.  
  836.  
  837.     move.w    d3,d2
  838.     subq.w    #1,d2
  839.     movea.l    a3,a1
  840. L7e0:
  841.     move.b    (a1)+,d0
  842.     add.w    d0,d0
  843.     addq.w    #1,M41d8-M4192(a5,d0.w)
  844.     dbra    d2,L7e0
  845.  
  846.  
  847.  
  848.  
  849.     moveq.l    #$10-1,d2
  850.     lea.l    4(a5),a1
  851.     lea.l    M41d8+2(a6),a0
  852.     moveq    #0,d1
  853. L81e:
  854.     move.w    (a0)+,d0
  855.     asl.w    d2,d0
  856.     add.w    d0,d1
  857.     move.w    d1,(a1)+
  858.     dbra    d2,L81e
  859.  
  860.  
  861.  
  862.  
  863.     moveq.l    #$10,d5
  864.     sub.w    a4,d5
  865.     move.w    a4,d2
  866.     subq.w    #1,d2
  867.     moveq    #0,d1
  868.     bset    d2,d1
  869.     lea.l    M41b6+2(a6),a1
  870.     lea.l    2(a5),a0
  871. L856:
  872.     move.w    (a0),d0
  873.     lsr.w    d5,d0
  874.     move.w    d0,(a0)+
  875.     move.w    d1,(a1)+
  876.     lsr.w    #1,d1
  877.     dbra    d2,L856
  878.  
  879.  
  880.     move.w    d5,d2
  881.     subq.w    #1,d2
  882.     moveq.l    #0,d1
  883.     bset    d2,d1
  884. L886:
  885.     move.w    d1,(a1)+
  886.     lsr.w    #1,d1
  887.     dbra    d2,L886
  888.  
  889.  
  890.  
  891.  
  892.  
  893.     move.w    a4,d0
  894.     moveq    #0,d1
  895.     bset    d0,d1
  896.     add.w    d0,d0
  897.     move.w    2(a5,d0.w),d2
  898.     lsr.w    d5,d2
  899.     beq    L8d0
  900.  
  901.     sub.w    d2,d1
  902.     beq    L8d0
  903.     subq.w    #1,d1
  904.  
  905.     movea.l    $14-2-4+$24(sp),a0
  906.     add.w    d2,d2
  907.     adda.w    d2,a0
  908.     moveq    #0,d0
  909. L8c8:
  910.     move.w    d0,(a0)+
  911.     dbra    d1,L8c8
  912. L8d0:
  913.  
  914.     *
  915.  
  916. ****
  917.  
  918.  
  919.  
  920.  
  921.     moveq.l    #0,d6
  922.     move.w    d3,d7
  923.  
  924.  
  925. table_make_loop:
  926.     moveq    #0,d0
  927.     move.b    (a3)+,d0
  928.     beq    L9da
  929.     move.w    d0,d2
  930.  
  931.     add.w    d0,d0
  932.     move.w    (a5,d0.w),d4
  933.     move.w    d4,d1
  934.     add.w    M41b6-M4192(a5,d0.w),d1
  935.     move.w    d1,(a5,d0.w)
  936.  
  937.     movea.l    $14-2-4+$24(sp),a0
  938.     cmpa.w    d2,a4
  939.     bcs    L946
  940.  
  941.     move.w    d1,d2
  942.     sub.w    d4,d2
  943.     *bls    L9da
  944.     subq.w    #1,d2
  945.     add.w    d4,d4
  946.     adda.w    d4,a0
  947. L93a:
  948.     move.w    d6,(a0)+
  949.     dbra    d2,L93a
  950.     bra    L9da
  951.  
  952.  
  953. L946:        * 呼ばれる回数少ない?
  954.     move.w    d4,d0
  955.     lsr.w    d5,d0
  956.     add.w    d0,d0
  957.     adda.w    d0,a0
  958.     sub.w    a4,d2
  959.     subq.w    #1,d2
  960.     bmi    L9c8
  961.  
  962.     move.w    d7,d0
  963.     add.w    d0,d0
  964.     lea.l    M1498(a6),a2
  965.     adda.w    d0,a2
  966.     lea.l    M0ca2(a6),a1
  967.     adda.w    d0,a1
  968.     moveq    #0,d0
  969. L990:
  970.     move.w    (a0),d1
  971.     bne    L99c
  972.     move.w    d0,(a1)+
  973.     move.w    d0,(a2)+
  974.     move.w    d7,(a0)
  975.     move.w    d7,d1
  976.     addq.w    #1,d7
  977. L99c:
  978.     add.w    d4,d4
  979.     btst    d5,d4
  980.     beq    L9b2
  981.     lea.l    M1498(a6),a0
  982.     bra    L9be
  983. L9b2:
  984.     lea.l    M0ca2(a6),a0
  985. L9be:
  986.     add.w    d1,d1
  987.     adda.w    d1,a0
  988.     dbra    d2,L990
  989.  
  990.  
  991. L9c8:
  992.     move.w    d6,(a0)
  993. L9da:
  994.     addq.w    #1,d6
  995.     cmp.w    d3,d6
  996.     bcs    table_make_loop
  997.  
  998.  
  999.     movem.l    (sp)+,d3-d7/a2-a5
  1000.     rts
  1001.  
  1002.  
  1003.  
  1004.  
  1005.     .bss
  1006. WORK_adr:
  1007.     .ds.b    WORK_SIZE
  1008.     .end
  1009.